﻿#ifndef QLIB_HEADER_OBJECT
#define QLIB_HEADER_OBJECT

#include <memory>

namespace qlib {

enum struct GeoPartType {
  None = 0,
  Point,        // 顶点
  Center,       // 中心点
  Edge,         // 边
  EdgeMid,      // 边中点
  BoxPoint,     // box顶点
  BoxEdge,      // box边
  BoxEdgeMid,   // box边中点
  ArcStart,     // 圆弧起点
  ArcEnd,       // 圆弧终点
  ArcCenter,    // 圆弧中点
  Arc,          // 扇形圆弧
  RadiusStart,  // 扇形起始半径
  RadiusEnd,    // 扇形终止圆弧
};

/**
 * @brief 扩展T类型
 * 
 * 扩展s_ptr类型、copy和create接口
 */
template <typename T>
class Object {
 public:
  Object() {}
  ~Object() {}

  /**
   * @brief T类型智能指针
  */
  using s_ptr = std::shared_ptr<T>;

  /**
   * @brief 拷贝接口
   * 
   * @details 派生类中调用create(T)接口实现
   */
  virtual s_ptr copy() const = 0;

  /**
   * @brief 创建接口
   * 
   * 返回可变参数构造的对象 
   */
  template <typename... Args>
  static s_ptr create(Args... args) {
    return std::make_shared<T>(args...);
  }

  /**
   * @brief 创建接口
   * 
   * 返回无参构造的对象 
   */
  // template <>
  static s_ptr create() {
    return std::make_shared<T>();
  }

  /**
   * @brief 拷贝创建接口
   * @param[in] value 被拷贝对象
   * @return 拷贝副本
   */
  static s_ptr create(const T& value) { return std::make_shared<T>(value); }
};

}  // namespace qlib

#endif  // QLIB_HEADER_ERROR